package com.myapp.dao;

import com.myapp.model.Empleados;
import com.myapp.model.Nominas;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import javax.persistence.Query;

@Stateless
public class NominasDAO implements NominasDAOLocal {

    @EJB
    private EmpleadoDAOLocal empleadosDAO;
    @PersistenceContext(unitName = "CRUDWebApplicationModifPU", type = PersistenceContextType.TRANSACTION)
    private EntityManager Teruel;

    @Override
    public boolean addNomina(Nominas nomina) {
        // se añade una nómina en la BBDD de Teruel
        if (!nomina.getAnio().equals("") && !nomina.getMes().equals("")) {
            Teruel.persist(nomina);
            return true;
        } else {
            return false;
        }


    }

    @Override
    public boolean editNomina(Nominas nomina) {
        // si el mes y el año no son vacíos, editamos la nómina
        if (!nomina.getAnio().equals("") && !nomina.getMes().equals("")) {
            Teruel.merge(nomina);
            return true;
        } else {
            return false;
        }

    }

    @Override
    public int deleteNomina(String Nominaid) {
        // se borra una nómina de la BBDD
        String ejbQL = "DELETE FROM Nominas n WHERE n.Nominaid LIKE ?1";
        Query query = Teruel.createQuery(ejbQL);
        //substitute parameter.
        query.setParameter(1, Nominaid);
        return query.executeUpdate();
        
    }

    @Override
    public List getNomina(String Nominaid) {
        // se devuelve una nómina de la BBDD
        String ejbQL = "SELECT n.Nominaid, n.Mes, n.Anio, n.Sueldo, n.Retencion FROM Nominas n WHERE n.Nominaid LIKE ?1";
        Query query = Teruel.createQuery(ejbQL);
        query.setParameter(1, Nominaid);
        List l = query.getResultList();
        return l;

    }

    @Override
    public List<Nominas> getAllNominas() {
        // se devuelven TODAS las nóminas de la BBDD de Teruel
        List<Nominas> l = Teruel.createNamedQuery("Nominas.getAll").getResultList();
        return l;
    }

    @Override
    public List consultarParametros(String departamento, String sucursal, String mes, String anio) {

        List<Empleados> listaEmpleados;
        List l2 = new ArrayList();
        List l3;
        List listaNominas = new ArrayList();
        
        /*
         * buscarPorSuc_Dep nos devolverá la lista de empleados que estén en el departamento seleccionado,
         * en la sucursal seleccionada, en el departamento y sucursal seleccionados o todos si no se marcó
         * ninguna opción
         */
        listaEmpleados = empleadosDAO.buscarPorSuc_Dep(departamento, sucursal); //busca primero los empleados en funcion de sucursal/depart

        if ((!"".equals(mes)) && (!"".equals(anio))) {
            if (listaEmpleados.isEmpty()) //si no se ha encontrado nada no seguimos buscando
            {
                return null;
            }
        }

        if ((!"".equals(anio)) && (!"".equals(mes))) {
            // devolvemos las nóminas con año y mes seleccionado
            String ejbQL = "SELECT n.Nominaid, n.Mes, n.Anio, n.Sueldo, n.Retencion FROM Nominas n WHERE n.Mes LIKE ?1 AND n.Anio LIKE ?2 AND n.Nominaid LIKE ?3";
            Query query = Teruel.createQuery(ejbQL);
            query.setParameter(1, mes);
            query.setParameter(2, anio);
            for (Empleados emp : listaEmpleados) {
                query.setParameter(3, emp.getDNI());
                listaNominas.addAll(query.getResultList());

            }
        } else if (("".equals(anio)) && ("".equals(mes))) {
            // se devuelven las nóminas solamente en función del departamento y sucursal
            for (Empleados emp : listaEmpleados) {
                String ejbQL = "SELECT n.Nominaid, n.Mes, n.Anio, n.Sueldo, n.Retencion FROM Nominas n WHERE n.Nominaid LIKE ?1";
                Query query = Teruel.createQuery(ejbQL);
                query.setParameter(1, emp.getDNI());
                listaNominas.addAll(query.getResultList());

            }
        } else if (("".equals(mes))) {//si el mes es vacío
            // se devuelven las nóminas en función del departamento, sucursal y año
            String ejbQL = "SELECT n.Nominaid, n.Mes, n.Anio, n.Sueldo, n.Retencion FROM Nominas n WHERE n.Anio LIKE ?1 AND n.Nominaid LIKE ?2";
//            String ejbQL = "SELECT n FROM Nominas n WHERE n.Anio LIKE ?1 AND n.Nominaid LIKE ?2";
            Query query = Teruel.createQuery(ejbQL);
            for (Empleados emp : listaEmpleados) {

                query.setParameter(1, anio);
                query.setParameter(2, emp.getDNI());
                listaNominas.addAll(query.getResultList());

            }
        } else if (("".equals(anio))) { //si está vacío el año
            // se devuelven las nóminas en función del departamento, sucursal y mes
            String ejbQL = "SELECT n.Nominaid, n.Mes, n.Anio, n.Sueldo, n.Retencion FROM Nominas n WHERE n.Mes LIKE ?1 AND n.Nominaid LIKE ?2";
            Query query = Teruel.createQuery(ejbQL);
            query.setParameter(1, mes);
            for (Empleados emp : listaEmpleados) {
                query.setParameter(2, emp.getDNI());
                listaNominas.addAll(query.getResultList());
            }
        }

        return listaNominas;

    }
}
